package com.li.aspect;

import com.li.Exception.MyException;
import com.li.entity.Result;
import com.li.utils.ThreadLocalUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;

/*
 * 增强repostcontroller类
 * 自动处理异常
 *
 * */
/*@Component("exceptionAspect")*/
@Aspect   // 配置切面   通知类
public class ExceptionAspect {

    @Autowired
    private JedisPool jedisPool;


   /* // 切入点 方法
    @Pointcut("execution(* com.karen.health.controller.ReportController.*(..))")
    public void pc() {
    }

    //环绕处理异常
    @Around("pc()")*/
    //   增强切入点的参数   增强 返回值
    public Object around(ProceedingJoinPoint pjp) {


        //  获取目标方法的形式参数
        Object[] args = pjp.getArgs();
        try {
            //前置  暂不需要
            // 执行目标方法   proceed 为该方法的返回值  对应本项目 就是Result
            Object proceed = pjp.proceed(args);
            // 正常执行后
            return proceed;
        } catch (Throwable e) {

            // 异常

            /** 难点  如何动态获取失败的对应信息提示 MessageConstant...
             *  思路 ： 在创建一个增强方法动态获取对应的失败后的提示信息 redis缓冲
             */
         /*   Jedis jedis = jedisPool.getResource();
            String fail = jedis.get("fail");
            jedis.close();*/
           /* ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
            String fail = (String) request.getAttribute("message");
            return new Result(false,fail);*/
            throw new MyException();

        }
    }



}
